""""""
"""
进程: 就是一个程序,运行在系统之上,那么便称之为这个程序为一个运行进程. 并分配进程ID方便系统管理
线程: 线程是归属于进程的. 一个进程.可以开启多个线程,并执行不同的工作,是进程实际工作最小单位

操作系统中可以运行多个进程,即多任务运行
一个进程内可以运行多个线程,即多线程运行

操作系统中可以运行多个进程,即多任务运行
一个进程内可以运行多个线程,即多线程运行

进程之间就是并行执行的,操作系统可以同时运行好多程序. 这些程序都是在并行执行
除了进程外, 线程其实也可以并行执行的
一个程序在同一时间执行多个线程. 我们称之为: 多线程并行执行

题外话 我们前面学习编写的程序,其实但是单线程执行的.
所以这里我们特别教多线程证明执行
"""

"""
下面来说多线程怎么实现
threading 模块
python 的多线程可以通过 threading 模块来实现

thread_obj = threading.Thread( [group [, target [, name [, args  [, kwargs] ] ] ]] )  # 这里中括号代表是可以省略的,不是语法

下面是 关键字
group 暂时无用,未来功能的预留参数
target 执行的目标任务名
args   以元组的方式,给执行的任务传参 (按照参数的顺序) 参数哪怕只有一个后面也要加 逗号,不然不识别为元组
kwargs 以字典的方式,给执行的任务传参
name 线程名,一般不用设置

# 启动线程,让线程工作
thread_obj.start()
"""

# 导入多线程的模块
import threading

import time  # 时间模块用于函数里的功能


def 唱歌(形参):
    while True:  # 无限循环
        # print('我在唱歌.....')
        print(形参)
        time.sleep(1)  # 间隔1秒 (休眠1秒)


def 跳舞(参数1):
    while True:  # 无限循环
        # print('我在  跳舞.....')
        print(参数1)
        time.sleep(1)  # 间隔1秒 (休眠1秒)


# 你要建立几个线程就,建立几个实例(对象).  关键字里传的是 函数名
# 多线程实例1 = threading.Thread(target=唱歌)  # 普通方式
# 多线程实例2 = threading.Thread(target=跳舞)

# 元组和字典传参情况
多线程实例1 = threading.Thread(target=唱歌, args=("我是唱歌222222",))  # 特别注意要加 逗号 ,不然不能识别是元组 另外还要注意传参的顺序
多线程实例2 = threading.Thread(target=跳舞, kwargs={'参数1': "我是  跳舞222222"})  # 这里密钥key, 名字要和函数里的参数名相同

# 启动线程,执行任务
多线程实例1.start()
多线程实例2.start()

"""
从输出可以看到,2个结果是一起出现的.
可以看出,多线程也是 通过类建立实例(对象),然后通过 类对象 来处理的
"""

# 额外看看多线程下输出情况
# 唱歌()
# 跳舞()  # 由于先执行 唱歌() 函数,无限循环下, 跳舞() 根本无法执行
